/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "拾取.h"

#include "面/面.h"

static float32 g线拾取距离 = 0.1;



//S_物体拾取信息 f_pick_射线拾取网格面(
//	S_物体* ob
//	, const Mat44f& mat
//	, const vec3& s
//	, const vec3& dir
//	, S_Mesh* mesh
//	//float32 范围距离
//	) {
//	S_物体拾取信息 物体拾取信息 = { nullptr, -1, 100000000 };
//	vec3 交点 = {};
//	float32 当前距离 = 100000000;
//
//	float32* 独立缩放 = nullptr;
//
//	switch (ob->m_Type) {
//		case E_物体类型::t_骨架:
//		//	if (ob->m_实例数量 >= 1) break;
//		case E_物体类型::t_骨骼: {
//			//独立缩放 = f_buf_F32_ptr(ob->m_骨架->m_骨骼长度);
//			//uint32 num = ob->m_骨架->m_骨骼长度.m_Mem.m_大小;
//			//
//			//if (f_surface_射线面相交(mesh, mat, 独立缩放[ob->m_实例ID], s, dir, 交点, 当前距离)) {
//			//	if (当前距离 < 物体拾取信息.相交距离) {
//			//		物体拾取信息.相交距离 = 当前距离;
//			//		物体拾取信息.实例ID = ob->m_实例ID;
//			//		物体拾取信息.物体 = ob;
//			//	}
//			//}
//			//break;
//		}
//
//		case E_物体类型::t_多边形:
//		case E_物体类型::t_网格:
//			//跳到实例 当个实例处理
//			if (ob->m_变换矩阵.m_Mem.m_大小 > 1) break;
//
//		case E_物体类型::t_实例: {
//			if (mesh->m_索引->m_Mem.m_大小 > 10000) {
//				S_拾取信息 pick_info = f_surface_Gpu射线拾取面(mesh, s, dir, mat);
//				if (pick_info.相交距离 >= 0) {
//					物体拾取信息.相交距离 = (pick_info.相交距离);
//					物体拾取信息.实例ID = ob->m_实例ID;
//					物体拾取信息.物体 = ob;
//				}
//			}
//			else {
//				if (f_surface_射线面相交(mesh, mat, 1.0f, s, dir, 交点, 当前距离)) {
//					//std::cout<<"当前距离 = " << 当前距离 << std::endl;
//					if (当前距离 < 物体拾取信息.相交距离) {
//						物体拾取信息.相交距离 = 当前距离;
//						物体拾取信息.实例ID = ob->m_实例ID;
//						物体拾取信息.物体 = ob;
//					}
//				}
//			}
//			break;
//		}
//
//		case E_物体类型::t_线段: {
//			for (uint32 i = 0; i < mesh->m_间接->m_Mem.m_大小; ++i) {
//				S_线拾取 info = f_surface_线段相交(mesh, mat, s, dir, 当前距离, i);
//				if (info.相交距离 < g线拾取距离) {
//					if (当前距离 < 物体拾取信息.相交距离) {
//						物体拾取信息.相交距离 = 当前距离;
//						物体拾取信息.实例ID = ob->m_实例ID;
//						物体拾取信息.物体 = ob;
//					}
//				}
//			}
//			break;
//		}
//
//		case E_物体类型::t_虚拟体:
//		case E_物体类型::t_区域光_方形:
//		case E_物体类型::t_区域光_圆形:
//		case E_物体类型::t_平行光:
//		case E_物体类型::t_聚光灯:
//		case E_物体类型::t_区域光:
//		//case E_物体类型::t_点光源:
//		//case E_物体类型::t_包: 
//		{
//			Mat44f 当前变换 = mat;
//			S_摄像机* 摄像机 = dynamic_cast<S_摄像机*>(f_ob_get子对象(ob, 0));
//			if (摄像机) {
//				当前变换 = mat * f_mat44_构建缩放矩阵(f_camera_计算摄像机以角度缩放大小(摄像机));
//			}
//
//			if (mesh->m_间接) {
//				//const auto& indirect = f_buf_at_Indirect(*mesh->m_间接, ob->m_实例ID);
//				S_线拾取 info = f_surface_线段相交(mesh, 当前变换, s, dir, 当前距离, ob->m_实例ID);
//				if (info.相交距离 < g线拾取距离) {
//					物体拾取信息.相交距离 = 当前距离;
//					物体拾取信息.实例ID = ob->m_实例ID;
//					物体拾取信息.物体 = ob;
//				}
//			}
//			else {
//				S_线拾取 info = f_surface_线段相交(mesh, 当前变换, s, dir, 当前距离, ob->m_实例ID);
//				if (info.相交距离 < g线拾取距离) {
//					物体拾取信息.相交距离 = 当前距离;
//					物体拾取信息.实例ID = ob->m_实例ID;
//					物体拾取信息.物体 = ob;
//				}
//			}
//
//			break;
//		}
//
//		/*case E_物体类型::t_区域光_方形:
//		case E_物体类型::t_区域光_圆形:
//		case E_物体类型::t_平行光:
//		case E_物体类型::t_聚光灯:
//		case E_物体类型::t_区域光:*/
//		case E_物体类型::t_点光源: {
//			//距离 = f_graph_点到直线距离(s, dir, ob->m_包围盒.pos);
//			vec3 location = f_ob_get全局坐标(ob, ob->m_实例ID);
//			float32 距离 = f_graph_点到直线距离(s, dir, location);
//			//std::cout << "距离 = " << 距离 << std::endl;
//			if (距离 < vec_Max(ob->m_变换.scale) + 0.1) {
//				距离 += vec_len(s - location);
//
//				物体拾取信息.相交距离 = 距离;
//				物体拾取信息.实例ID = ob->m_实例ID;
//				物体拾取信息.物体 = ob;
//			}
//			break;
//		}
//
//		default:
//			break;
//	}
//
//    return S_物体拾取信息();
//}



float32 f_pick_模型拾取(S_Mesh* mesh, const vec3& s, const vec3& dir, const Mat44f& mat, uint32 网格层, const S_摄像机& camera) {
	S_物体拾取信息 物体拾取信息 = { nullptr, -1, 100000000 };
	float32 当前拾取距离 = 100000000;
	float32 拾取距离 = 100000000;
	vec3 交点 = {};

	switch (网格层) {
		case E_物体网格元素类型::e_MT_面: {
			if (mesh->m_索引->m_Mem.m_数量 > 10000) {
				//S_拾取信息 pick_info = f_surface_Gpu射线拾取面(mesh, s, dir, mat, camera.m_相机逆矩阵);
				//if (pick_info.相交距离 >= 0) {
				//	拾取距离 = (pick_info.相交距离);
				//}
			}
			else {
				//if (f_surface_射线面相交(mesh, mat[0], 1.0f, s, dir, 交点, 当前拾取距离)) {
				//	if (当前拾取距离 < 拾取距离) {
				//		拾取距离 = 当前拾取距离;
				//	}
				//}
			}
			break;
		}
		case E_物体网格元素类型::e_MT_框: {
			//S_线拾取 拾取信息 = f_surface_线段相交(mesh, mat, s, dir, );
			break;
		}
		default:
			break;
	}
	return 0;
}

